package com.hjq.mallproduct;

import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cache.annotation.EnableCaching;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.cloud.openfeign.EnableFeignClients;
import org.springframework.session.data.redis.config.annotation.web.http.EnableRedisHttpSession;

/**
 * 1如何使用mybatis-plus
 * 1）导入依赖：已经在common中传递过来啦
 * 2）配置：
 * 1.数据源（在properties中配置）
 * 2.配置mybatis-plus
 * 1.mapperscan:mapper接口的位置
 * 2.mysql映射文件xml的位置配置，在配置文件
 * 2如何使用mybatis-plus 的逻辑删除：
 * 1）先配置全局的逻辑删除标识在application.yml
 * mybatis-plus:
 * global-config:
 * db-config:
 * logic-delete-field: flag # 全局逻辑删除的实体字段名(since 3.3.0,配置后可以忽略不配置步骤2)
 * logic-delete-value: 1 # 逻辑已删除值(默认为 1)
 * logic-not-delete-value: 0 # 逻辑未删除值(默认为 0)
 * 2)在标识字段加上@Tablelogic注解
 * 3.如何添加后台品牌校验？（JSR303）
 *    1)给bean添加注解(@NotEmpty@NotBlank)
 *    2)给要接受信息的Controller变量前面加上@Valid注解，这样就会对发来的表单信息进行校验
 *    3）紧跟一个BindingResult bindingResult/封装了前面那个参数的校验结果，就可以实现自定义封装
 * 4,@ControllerAdvice://表示集中处理某块区域的异常，由参数basepackage限制处理的范围。这个会被IOC容器接受，可以直接返回数据
 * 5.@ExceptionHandler:在ControllerAdvice注解类中处理具体类型的Exception
 *
 * 6.分组校验：告诉Handler在什么时候校验，Groups为自己定义的接口。
 *        1）@NotNull(message ="修改时Id不得为空" ,groups = {UpdateGroup.class})
 *        @Null(message = "增加时Id必须为空",groups = {AddGroup.class})
 *        2）在Controller方法的参数前不使用@Valid，而是使用@Validated
 *        public R save(@Validated({AddGroup.class}) @RequestBody BrandEntity brand)
 *        3)实体类没有写分组的@NotBlank,只会在没有分组的（不是@Validated({AddGroup.class})）的校验中生效
 * 7.自定义校验注解
 * 1）自定义校验注解
 * 2）自定义校验器
 * 3)让自定义注解关联校验器：
 * @Documented
 * @Constraint(
 *         validatedBy = {ListValConstraintVadidator.class}
 * )
 * @Target({ElementType.METHOD, ElementType.FIELD, ElementType.ANNOTATION_TYPE, ElementType.CONSTRUCTOR, ElementType.PARAMETER, ElementType.TYPE_USE})
 * @Retention(RetentionPolicy.RUNTIME)
 *
 *7.模板引擎
 * 1.引入thymeleaf依赖，将缓存关掉
 * 2，、
 * 8.redisson实现分布式锁的依赖
 *  * 1.引入依赖
 *  * 2，配置
 * 9.引入SpringCache简化缓存
 * 1.引入依赖spring-boot-starter-data-redis,spring-boot-starter-data-cache
 * 2).配置
 *      会自动配置的：CacheAutoConfiguration->redisCacheConfiguration->redisCacheManagement
 *      我们要配置的：配置cache.type=redis
 *      注解：
 * @Cacheable:出发将数据保存到缓存
 * @CacheEvict:将数据从缓存删除
 * @CAchePut：不影响方法执行更新缓存
 * @Caching：组合多个缓存操作
 * @CacheConfig：在类级别在共享缓存的相同配置
 *3)@EnableCache
 *4)为了修改默认配置，需要将redisCacheConfiguration放入ioc容器
 */
@SpringBootApplication
@MapperScan("com.hjq.mallproduct.dao")
@EnableDiscoveryClient
@EnableFeignClients(basePackages = "com.hjq.mallproduct.feign")
@EnableRedisHttpSession
public class MallProductApplication {

    public static void main(String[] args) {
        SpringApplication.run(MallProductApplication.class, args);
    }

}
